



// 在ts中如何定义类  以及 类的修饰符 如何使用


//  protected 受保护的


// class Person {
//     name:string;
//     age:number;
//     sex:string;

//     constructor (name:string , age:number , sex:string) {
//         this.name = name;
//         this.age = age ;
//         this.sex= sex;
//     }

//     eatFood ():void {
//         console.log(`${this.name} 会吃饭`)
//     }
//     //  static 用来声明静态属性和方法

//     static eat (name:string) : void {
//         console.log(`${name}很会吃`)
//     }
// };


// let person = new Person("张三",19 , "男");
// person.eatFood();
// //  静态属性或者方法只能通过类名来调用 不能使用实例
// Person.eat("里斯")
// console.log(person)


// //  在类如果不写修饰符 默认的是public

// class Car {
//     // protected name:string;
//     constructor () {
//         // this.name = name;
//     }
//     protected run () {
//         console.log("会跑")
//     }

//     private drive () {
//         console.log("这个车只能我开")
//     }
// }


// class GTR extends Car {
//     init () {
//         this.run();
//     }
// };


// let car = new Car();

// let gtr = new GTR();

//  受保护的属性或者方法 只能在其内部或者是子类中访问

//  私有的 private  只能在该类的内部使用 
// car.run();


// gtr.init();

// gtr.run()

// car.drive()



// abstract class Animal {
//     abstract open:string;
//     move () {
//         console.log("move")
//     }
// };


//  范型 

//  类型的变量
//  范型并不是只是用T来表示  可以使用所有的英文字母来表示

// function add<C>(a:C):void {
//     console.log(a)
// };

// add<number>(1);

// add<string>("abc");
// add<boolean>(true);


//  范型接口
// interface Animal<T> {
//     name:T
// }

// const animal:Animal<string> = {
//     name:"123"
// }

// //  范型类
// class Tiger<T> {
//     public name:T;
//     constructor (name:T) {
//         this.name = name;
//     }
// };

// const tiget = new Tiger<string>("华南虎");

//  联合类型
//  联合类型是使用 ｜ 来表示
// let num:string|number | boolean;

// num = 123;
// num = "abc";
// num = true;
// num = undefined

// type AT  = number | string;

// //  范型约束
// interface Person<T extends AT> {
//     name:T
// }

// let person:Person<string> = {
//     name:"true"
// }


//  接口继承

// interface Animal {
//     name:string,
//     age:number
// }


// interface Tiger extends Animal{
//     sex:string
// };


// let tiger:Tiger = {
//     name:"东北虎",
//     age:3,
//     sex:"男"
// }



//  使用ts封装一个栈

//  栈  ： 先进后出  栈的最后一项叫栈顶  



class Stack<T>{
    private arr:T[] = [];

    public push (item:T) {
        this.arr.push(item)
    }

    pop () {
        this.arr.pop();
    }
};


let stack = new Stack();

stack.push(3);
stack.push(5);
stack.push("a");
stack.push(9);
stack.pop();
stack.pop();
console.log(stack)



















